package com.yhn.registration.service;

import com.hospital.common.base.Result;
import com.hospital.common.dto.registration.CreateRegistrationDto;
import com.hospital.common.pojo.TRegistration;
import com.yhn.registration.vo.RegistrationVo;

import java.util.List;


/**
 * 挂号预约服务接口
 *
 * @author yhn
 * @version 1.0
 */
public interface RegistrationService {

    /**
     * 创建挂号预约
     */
    Result<TRegistration> createRegistration(CreateRegistrationDto dto);

    /**
     * 根据患者ID查询挂号记录
     */
    Result<List<TRegistration>> listByPatientId(Long patientId);

    /**
     * 医生统计当天预约人数
     */
    Result<Integer> getDoctorDailyAppointments();

    /**
     * 取消预约（同时更新排班表数据）
     */
    Result<String> cancelRegistration(Long registrationId);

    /**
     * 数据修复：同步排班表的已预约人数
     */
    Result<String> syncScheduleData();

    /**
     * 取消当前挂号（调用支付取消，回滚号源，状态改为2）
     */
    Result<String> cancelAndRestore(Long patientId, Long registrationId);

    /**
     * 统计医生进行中与已完成的挂号数量
     */
    Result<Integer> countDoctorActiveRegistrations();

    /**
     * 医生查看各状态数量统计
     * 返回键：inProgress, completed, cancelled, notVisited
     */
    Result<java.util.Map<String, Integer>> countDoctorRegistrationsByState();

    /**
     * 患者查看各状态数量统计（全部时间）
     * 返回键：inProgress, completed, cancelled, notVisited
     */
    Result<java.util.Map<String, Integer>> countPatientRegistrationsByState();

    /**
     * 分页查询患者预约记录
     */
    Result<com.hospital.common.base.PageResult<TRegistration>> listPatientRegistrationsByPage(Integer state, Integer pageNum, Integer pageSize);

    /**
     * 后台管理 - 分页查询所有预约记录（支持多条件查询）
     */
    Result<com.hospital.common.base.PageResult<TRegistration>> listAllRegistrationsByPage(String patientName, String doctorName, String department, Integer state, String startTime, String endTime, Integer pageNum, Integer pageSize);

    /**
     * 后台管理 - 获取预约统计信息
     */
    Result<java.util.Map<String, Object>> getRegistrationStats();

    /**
     * 后台管理 - 根据ID查看预约详情
     */
    Result<TRegistration> getRegistrationDetail(Long id);

    /**
     * 根据医生ID查询其患者预约信息
     */
    List<RegistrationVo> queryByDoctorId();

    /**
     * 医生端：确定就诊（state=1 完成）
     */
    Result<String> confirmVisited(Long registrationId);

    /**
     * 医生端：未就诊（state=3 未就诊）
     */
    Result<String> markNotVisited(Long registrationId);

    /**
     * 统计当日预约总数（所有患者）
     */
    Result<Integer> countTodayAppointments();

    /**
     * 医生端：按条件查询患者，支持分页，按预约时间降序排列
     */
    Result<com.hospital.common.base.PageResult<RegistrationVo>> doctorSearchPatients(String patientName,
                                                                                    String startTime,
                                                                                    String endTime,
                                                                                    Integer pageNum,
                                                                                    Integer pageSize);

    /**
     * 医生查询今日所有患者（按预约时间升序排列）
     */
    Result<java.util.List<RegistrationVo>> doctorListTodayPatients();
}
